require('./models/topic');
var express = require('express')
var path = require('path')
var bodyParser = require('body-parser')
var session = require('express-session')
var router = require('./router')
const sd = require('silly-datetime')
    // var ejs = require('ejs');
var app = express()

app.use('/public/', express.static(path.join(__dirname, './public/')))
    // app.use('/public/', express.static('./public/'))
app.use('/node_modules/', express.static(path.join(__dirname, './node_modules/')))
app.use('/static/', express.static(path.join(__dirname, './static/')))
    // 在 Node 中，有很多第三方模板引擎都可以使用，不是只有 art-template
    // ejs、jade（pug）、handlebars、nunjucks
    //    <%%>
    //    {{}}
    //    h1
    //    div
    //      h1

// 1. 告诉express框架使用什么模板引擎渲染什么后缀的模板文件
// app.engine('html', ejs.__express);
app.engine('html', require('express-art-template'))
    // locals()方法可以一次获取所有模板的公共数据，这些公共数据可以被用在所有模板中
    // 此处向所有模板传递一个处理时间函数
app.locals.sd = function(time) {
        return sd.format(time, 'YYYY-MM-DD hh:mm:ss')
    }
    // 2. 告诉express框架模板存放的位置是什么
    // 第一个views是固定的,是express的配置项名字，告诉express框架模板存放的位置
    // 第二个views是文件夹的名字
    /**
     * express的set()方法：
     * 1. 设置模板存放目录
     *  1.1 第一个参数是设置存放模板目录的文件夹
     *  1.2 第二个参数是存放模板的绝对路径
     * 2. 设置默认的模板后缀，设置模板时，如果没有写模板后缀就使用当前设置的模板后缀
     *  2.1 第一个参数是 默认模板的配置项
     *  2.2 第二个参数是后缀的名字
     */
app.set('views', path.join(__dirname, './views/')) // 默认就是 ./views 目录
    // 3. 告诉express框架模板的默认后缀是什么 ( 方便在渲染模板的时候，省去后缀 )
app.set('view engine', 'html');
// 配置解析表单 POST 请求体插件（注意：一定要在 app.use(router) 之前 ）
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
    // parse application/json
app.use(bodyParser.json())
    // 在 Express 这个框架中，默认不支持 Session 和 Cookie
    // 但是我们可以使用第三方中间件：express-session 来解决
    // 1. npm install express-session
    // 2. 配置 (一定要在 app.use(router) 之前)
    // 3. 使用
    //    当把这个插件配置好之后，我们就可以通过 req.session 来发访问和设置 Session 成员了
    //    添加 Session 数据：req.session.foo = 'bar'
    //    访问 Session 数据：req.session.foo

app.use(session({
    // 配置加密字符串，它会在原有加密基础之上和这个字符串拼起来去加密
    // 目的是为了增加安全性，防止客户端恶意伪造
    secret: 'itcast',
    resave: false,
    saveUninitialized: false // 无论你是否使用 Session ，我都默认直接给你分配一把钥匙
}))

// 把路由挂载到 app 中
app.use(router)

// 配置一个处理 404 的中间件
app.use(function(req, res) {
    res.render('404.html')
})

// 配置一个全局错误处理中间件
app.use(function(err, req, res, next) {
    res.status(500).json({
        err_code: 500,
        message: err.message
    })
})


app.listen(5000, function() {
    console.log('running...')
})